/*
 * leitura.c
 *
 *  Created on: 05/06/2012
 *      Author: annibal
 */

#include <stdlib.h>
#include <string.h>
#include "leitura.h"

/* Lê um caractere do arquivo de entrada */
char leCaractere(FILE *arq) {
	int novaLinha = FALSE;
	char c;

	do {
		c = getc(arq);
		if (c == '\n') {
			if (novaLinha == FALSE) {
				novaLinha = TRUE;
			} else {
				return 0;
			}
		}
	} while (c == ' ' || c == '\r' || c == '\n' || c == '\t');

	if (c == EOF) {
		return EOF;
	}

	return c;
}

/* Lê um string do arquivo de especificação */
char* leString(FILE *arq) {
	int i, novaLinha = FALSE;
	char c, *str;

	str = (char*) calloc(MAX_CADEIA, sizeof(char));

	do {
		c = getc(arq);
		if (c == '\n') {
			if (novaLinha == FALSE) {
				novaLinha = TRUE;
			} else {
				return NULL;
			}
		}
	} while (c == ' ' || c == '\r' || c == '\n' || c == '\t');

	if (c == EOF) {
		return NULL;
	}

	i = 0;
	do {
		str[i] = c;
		c = getc(arq);
		i++;
	} while (c != ' ' && c != '\r' && c != '\n' && c != '\t' && c != EOF);

	return str;
}

/* Lê um inteiro positivo do arquivo de especificação */
int leInteiro(FILE *arq) {
	int resultado = 0, novaLinha = FALSE;
	char c;

	do {
		c = getc(arq);
		if (c == '\n') {
			if (novaLinha == FALSE) {
				novaLinha = TRUE;
			} else {
				return 0;
			}
		}
	} while (c == ' ' || c == '\r' || c == '\n' || c == '\t');

	if (c == EOF) {
		return c;
	}

	while (c == ' ' || c == '\n' || c == '\t') {
		c = getc(arq);
	}

	while (c >= '0' && c <= '9') {
		resultado *= 10;
		resultado += c - 0x30;
		c = getc(arq);
	}

	return resultado;
}

char *leCadeia(FILE *arq) {
	char *cadeia, *aux;

	cadeia = (char*) calloc(MAX_CADEIA, sizeof(char));

	do {
		aux = leString(arq);
		if (aux != NULL) {
			strcat(cadeia, aux);
			free(aux);
		}
	} while (aux != NULL);

	return cadeia;
}
